package com.wll.study.algotiyhm.about_linklode;


import java.util.LinkedList;

/**
 * 定义单链表
 */
class LinkNode {
    int val;
    LinkNode next;
    LinkNode(int val){
        this.val = val;
    }
    LinkNode(int val,LinkNode next){
        this.val = val;
        this.next = next;
    }
}

/**
 * 单链表基本增删改查
 * 高级操作
 * 1.在指定元素前插 后插
 * 2.删除指定元素前的N个元素  删除指定元素后的N个数据
 * 3.链表反转
 * @author wull
 */
public class ListNodeCURD {

    /**
     * 在链表的头部插入节点
     * @param head 头指针
     * @param node 要插入的节点
     * @return 新的列表的头指针
     */
    public static LinkNode addAhead(LinkNode head, LinkNode node){
        if (head == null){
            return node;
        }
        LinkNode temp = head;
        node.next = temp;
        head = node;
        return head;
    }

    /**
     * 在链表的尾部插入数据
     * @param head 头指针
     * @param node 节点
     * @return 新的头指针
     */
    public static LinkNode addTail(LinkNode head, LinkNode node){
        if (head == null){
            return node;
        }
        LinkNode temp = head;
        while (temp.next != null){
            temp = temp.next;
        }
        temp.next = node;
        return head;
    }

    /**
     * 在链表指定索引处插入元素 下标从1开始
     * @param head 链表头指针
     * @param node 节点
     * @param index 索引
     * @return 链表的头指针
     */
    public static LinkNode insertByIndex(LinkNode head, LinkNode node,int index){
        // 如果传入的链表为空 直接返回空
        if (head == null){return null;}
        LinkNode tmp = head;
        while (index-- > 1){
            if (index > 0 && tmp == null){
                tmp.next = node;
                System.out.println("index越界！默认在尾部插入");
                return null;
            }
            if (tmp.next == null){
                break;
            }
            tmp = tmp.next;
        }
        LinkNode next = tmp.next;
        node.next = next;
        tmp.next = node;
        return head;
    }

    /**
     * 打印当前链表的元素
     * @param head 链表的头指针
     */
    public static void displayLinkNode(LinkNode head){
        if(head == null){
            System.out.println("当前链表为空");
        }
        while (head!= null){
            System.out.print( head.val + ", ");
            head = head.next;
        }
        System.out.println("\n");
    }
    public static void main(String[] args) {
        LinkNode head = new LinkNode(2);

        head = addAhead(head,new LinkNode(5));
        head = addAhead(head,new LinkNode(1));
        head = addTail(head,new LinkNode(100));
        head = addTail(head,new LinkNode(101));
        head = insertByIndex(head,new LinkNode(3),2);
        displayLinkNode(head);


    }
}
